Complex software applications can no longer be designed and built as a monolithic system. Instead, the outward expression of the system can only be achieved by a cooperating set of programs. As each of these underlying programs also become more complex, they require more and more computing resources. These two principles primarily drive complex multiple machine software systems to require multiple cooperating computer programs spanning multiple pieces of computer hardware.
Complex multiple machine software systems require the deployment and configuration of software components on multiple machines. While a handful of cooperating software components and their associated resources can be configured and maintained “by hand” (e.g., an administrator specifies the configuration information and installs the appropriate software components on each machine), as the number of components increases, the system rapidly becomes harder to manage. For example, as the number of software components and machines increases, configuration and maintenance of the system by hand becomes more difficult and prone to human error.
Adding complexity to the problem, upgrading (or downgrading) versions of individual software components as new versions become available (or new versions need to be rolled back to prior versions) requires that the interaction of different “strains” or versions of the software be managed at the same time. Managing the different strains of software components by hand becomes more difficult and increasingly prone to human error, particularly as the number of software components, and versions of the software components increases.